﻿using System;
using System.IO;
using System.Linq;
using System.Security.AccessControl;
using System.Web;
using System.Web.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RA_WebSite.Controllers;
using RA_WebSite.Models;
using System.Collections.Generic;
using Rhino.Mocks;

namespace RA_WebSite.Tests.Controllers
{
    [TestClass]
    public class StepControllerTest
    {
        readonly FileStream inputs = new FileStream(@"..\..\TestFiles\5608 168h.jpg", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

        /// <summary>
        /// Recupera la lista di tutti gli step associati al campione
        /// Se la vista contiene una lisa di step il test è superato
        /// </summary>
        [TestMethod]
        public void Step_ListStepCampione()
        {
            var db = new RAContext();

            var ris = (from a in db.Campiones select a).FirstOrDefault();

            // Crea controller
            var controller = new StepController();

            // Azione
            var result = controller.ListStepCampione(ris.Id) as ViewResult;

            var c = (List<Step>)result.ViewData.Model;

            Assert.IsNotNull(c);
        }

        /// <summary>
        /// Recupera uno step casuale dal db e recupera di dettagli dello stesso passando per la vista
        /// del controller
        /// </summary>
        [TestMethod]
        public void Step_Details()
        {

            Step_Create();
            var db = new RAContext();
            var ris = (from a in db.Steps select a).FirstOrDefault();

            

            // Crea controller
            var controller = new StepController();

            // Azione
            var result = controller.Details((int)ris.Campione_Id, (int)ris.Id) as ViewResult;

            var c = (Step)result.ViewData.Model;

            Assert.IsNotNull(c.OreDiEsecuzione);
        }

        /// <summary>
        /// Crea uno step utilizzando un mock come immagine.
        /// Se è presente il test è passato
        /// </summary>
        [TestMethod]
        public void Step_Create()
        {
            var file = MockRepository.GenerateStub<HttpPostedFileBase>();
            //set any expectations

            file.Expect(f => f.FileName).Return("immagine.jpg");
            file.Expect(f => f.ContentType).Return("image/jpeg");
            file.Expect(f => f.InputStream).Return(inputs);
            file.Expect(f => f.ContentLength).Return((int)inputs.Length);

            var db = new RAContext();

            var controller = new StepController();

            var c = (from a in db.Campiones select a).FirstOrDefault();


            var StepTest = new Step()
            {
                Campione_Id = c.Id,
                DataCaricamento = new DateTime(2013,05,01),
                OreDiEsecuzione = 14
            };

            var result = controller.Create(StepTest,file) as ViewResult;

            var step = (from a in db.Steps where a.OreDiEsecuzione == 14 select a).FirstOrDefault();

            Assert.AreEqual(14, step.OreDiEsecuzione);
        }

        /// <summary>
        /// Recupera uno step casuale dal db e lo elimina tramite il contrller.
        /// Se non è più presente sul db il test passa
        /// </summary>
        [TestMethod]
        public void Step_Delete()
        {
            Step_Create();

            var db = new RAContext();
            var ris = (from a in db.Steps select a).FirstOrDefault();

            var controller = new StepController();

            var b = controller.DeleteConfirmed(ris.Id) as ViewResult;
            var g = (from a in db.Steps where ris.Id == a.Id select a).FirstOrDefault();
            Assert.IsNull(g);
        }


    }
}
